package com.android.yummycookies.storage;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.android.yummycookies.BuildConfig;
import com.android.yummycookies.util.Logger;

import android.graphics.Bitmap;
import android.util.SparseArray;

/**
 * 
 * @author julien Classe permetant de stocker des bitmap et des bitmap
 *         redimensionnes
 */
public class BitmapStorage implements IBitmapsStore {

	public static final String TAG = BitmapStorage.class.getSimpleName();

	/** Map contenant un ensemble de bitmap */
	private SparseArray<Bitmap> bitmaps = new SparseArray<Bitmap>();

	/** Map contenant un ensemble de bitmap redimensionnes */
	private SparseArray<Bitmap> scaledBitmaps = new SparseArray<Bitmap>();

	public BitmapStorage() {
		Logger.logDebug(TAG, TAG + " created");
	}

	@Override
	public Bitmap get(Integer id) {
		Logger.logDebug(TAG, "Get bitmap", id);
		return bitmaps.get(id);
	}

	@Override
	public Bitmap getScaledBitmap(Integer id) {
		Logger.logDebug(TAG, "Get scaled bitmap", id);
		return scaledBitmaps.get(id);
	}

	@Override
	public SparseArray<Bitmap> getAll(Set<Integer> ids) {
		Logger.logDebug(TAG, "Get all bitmaps", ids);

		SparseArray<Bitmap> sparseArrayBitmaps = new SparseArray<Bitmap>();
		for (Integer id : ids) {
			sparseArrayBitmaps.put(id, bitmaps.get(id));
		}
		return sparseArrayBitmaps;
	}

	@Override
	public SparseArray<Bitmap> getAllScaledBitmaps(Set<Integer> ids) {
		Logger.logDebug(TAG, "Get all scaled bitmaps", ids);

		SparseArray<Bitmap> sparseArrayScaledBitmaps = new SparseArray<Bitmap>();
		for (Integer id : ids) {
			sparseArrayScaledBitmaps.put(id, scaledBitmaps.get(id));
		}
		return sparseArrayScaledBitmaps;
	}

	@Override
	public void put(Integer id, Bitmap bitmap) {
		Logger.logDebug(TAG, "Put bitmap", id);
		bitmaps.put(id, bitmap);
	}

	@Override
	public void putScaledBitmap(Integer id, Bitmap bitmap) {
		Logger.logDebug(TAG, "Put scaled bitmap", id);
		scaledBitmaps.put(id, bitmap);
	}

	@Override
	public void putAll(Map<Integer, Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Put all bitmaps", bitmaps.keySet());
		for (Entry<Integer, Bitmap> e : bitmaps.entrySet()) {
			this.bitmaps.put(e.getKey(), e.getValue());
		}
	}

	@Override
	public void putAllScaledBitmaps(Map<Integer, Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Put all scaled bitmaps", bitmaps.keySet());
		for (Entry<Integer, Bitmap> e : bitmaps.entrySet()) {
			scaledBitmaps.put(e.getKey(), e.getValue());
		}
	}

	@Override
	public void putAll(SparseArray<Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Put all bitmaps", bitmaps);
		for (int i = 0; i < bitmaps.size(); i++) {
			this.bitmaps.put(bitmaps.keyAt(i), bitmaps.valueAt(i));
		}
	}

	@Override
	public void putAllScaledBitmaps(SparseArray<Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Put all scaled bitmaps", bitmaps);
		for (int i = 0; i < bitmaps.size(); i++) {
			scaledBitmaps.put(bitmaps.keyAt(i), bitmaps.valueAt(i));
		}
	}

	@Override
	public void remove(Integer id) {
		Logger.logDebug(TAG, "Remove bitmap", id);
		bitmaps.remove(id);
	}

	@Override
	public void removeScaledBitmap(Integer id) {
		Logger.logDebug(TAG, "Remove scaled bitmap", id);
		scaledBitmaps.remove(id);
	}

	@Override
	public void removeAll(Set<Integer> ids) {
		Logger.logDebug(TAG, "Remove all bitmaps", ids);
		for (Integer i : ids) {
			bitmaps.remove(i);
		}
	}

	@Override
	public void removeAllScaledBitmaps(Set<Integer> ids) {
		Logger.logDebug(TAG, "Remove all scaled bitmaps", ids);
		for (Integer i : ids) {
			scaledBitmaps.remove(i);
		}
	}

	@Override
	public void removeAll(SparseArray<Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Remove all bitmaps", bitmaps);
		for (int i = 0; i < bitmaps.size(); i++) {
			this.bitmaps.remove(bitmaps.keyAt(i));
		}
	}

	@Override
	public void removeAllScaledBitmaps(SparseArray<Bitmap> bitmaps) {
		Logger.logDebug(TAG, "Remove all scaled bitmaps", bitmaps);
		for (int i = 0; i < bitmaps.size(); i++) {
			scaledBitmaps.remove(bitmaps.keyAt(i));
		}
	}

	@Override
	public boolean isStored(Integer id) {
		Logger.logDebug(TAG, "Check is stored bitmap", id);
		return bitmaps.get(id) != null;
	}

	@Override
	public boolean isScaledBitmapStored(Integer id) {
		Logger.logDebug(TAG, "Check is stored scaled bitmap", id);
		return scaledBitmaps.get(id) != null;
	}

	@Override
	public void clear() {
		Logger.logDebug(TAG, "Clear all bitmaps");
		bitmaps.clear();
	}

	@Override
	public void clearScaledBitmaps() {
		Logger.logDebug(TAG, "Clear all scaled bitmaps");
		scaledBitmaps.clear();
	}

}
